💡 AI 인사이트

🤖 AI가 여기에 결과를 출력합니다...

댓글 커뮤니티

쿠팡이벤트

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

검색

    로딩 중이에요... 🐣

    [코담] 웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트

    30 Celery 비동기 작업 처리하기 | ✅ 편저: 코담 운영자

    30-Celery 비동기 작업 처리하기

    - Celery 비동기 작업 처리하기

    🔗 소스 1: bugbytes-io/drf-course-api

    🔗 소스 2: braverokmc79/Django_REST_Framework_Series


    1. 개요

    이번 강의에서는 Django REST Framework(DRF) 기반 애플리케이션에 Celery를 활용하여 비동기 작업을 처리하는 방법을 정리합니다. 특히 주문 생성 시 이메일 전송과 같이 응답 속도에 영향을 줄 수 있는 작업을 백그라운드에서 실행하는 방식에 초점을 맞춥니다.


    1. Celery란?

    Celery는 분산 작업 큐(Distributed Task Queue)로, 대규모 메시지를 처리하고 비동기 또는 주기적 작업을 실행할 수 있게 해주는 파이썬 라이브러리입니다. Django와 함께 사용할 때는 Redis나 RabbitMQ 같은 브로커를 통해 클라이언트와 워커 간 메시지를 교환합니다.


    2. 기본 구성 요소

    • 브로커(Broker): 메시지를 중개하는 역할 (Redis 사용)
    • 워커(Worker): 브로커로부터 전달받은 작업을 실행
    • 태스크(Task): 실행할 작업 단위 (예: 이메일 전송)

    3. 프로젝트 설정

    1단계. 설치

    pip install celery redis
    

    2단계. 프로젝트 루트에 celery.py 생성

    # myproject/celery.py
    import os
    from celery import Celery
    
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
    app = Celery("myproject")
    app.config_from_object("django.conf:settings", namespace="CELERY")
    app.autodiscover_tasks()
    

    3단계. __init__.py에 Celery 앱 등록

    # myproject/__init__.py
    from .celery import app as celery_app
    __all__ = ("celery_app",)
    

    4단계. settings.py 설정

    CELERY_BROKER_URL = 'redis://localhost:6379/1'
    CELERY_RESULT_BACKEND = 'redis://localhost:6379/1'
    EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
    DEFAULT_FROM_EMAIL = 'noreply@example.com'
    

    4. Celery 태스크 정의

    api/tasks.py:

    from celery import shared_task
    from django.core.mail import send_mail
    from django.conf import settings
    
    @shared_task
    def send_order_confirmation_email(order_id, user_email):
        subject = "주문 확인"
        message = f"주문 번호 {order_id}가 접수되었습니다."
        return send_mail(
            subject,
            message,
            settings.DEFAULT_FROM_EMAIL,
            [user_email]
        )
    

    5. View에서 비동기 작업 호출

    perform_create 메서드에서 태스크 호출:

    from api.tasks import send_order_confirmation_email
    
    class OrderViewSet(...):
        def perform_create(self, serializer):
            order = serializer.save(user=self.request.user)
            send_order_confirmation_email.delay(order.id, self.request.user.email)
    
    • .delay()를 호출하면 Redis 브로커를 통해 작업이 워커로 전송됨
    • ORM 객체 대신 단순한 타입만 인자로 넘길 것

    6. 워커 실행

    celery -A myproject worker --loglevel=info
    
    • -A 옵션은 Celery 앱 위치 지정
    • --loglevel=info는 로그 출력 수준 설정

    7. 결과 확인

    1. Django 서버 실행 후, 주문 생성 API 호출
    2. Celery 워커 터미널에서 이메일 전송 메시지가 출력됨
    3. 콘솔 이메일 백엔드이므로 실제 메일은 전송되지 않고 터미널에 표시됨

    8. 확장 팁

    • 결과 저장이 필요하면 CELERY_RESULT_BACKEND 설정을 통해 Redis 등에 저장 가능
    • 주기적 작업이 필요하면 Celery Beat 활용 (스케줄링 가능)
    • 복잡한 흐름은 체이닝, 그룹화 등의 기능으로 구현 가능

    마무리

    Celery를 활용하면 DRF API에서 긴 시간이 필요한 작업을 백그라운드로 분리해, 응답 속도를 향상시키고 사용자 경험을 개선할 수 있습니다. 이번 예제에서는 이메일 전송을 다뤘지만, 이미지 처리, 외부 API 호출, 통계 집계 등 다양한 분야에 적용 가능합니다.

    자세한 내용은 Celery 공식 문서를 참고하세요.


    Spring Boot Kafka vs Django Celery 비교

    백엔드에서 비동기 작업 처리는 필수적인 기능입니다. Python 진영에서는 Django + Celery, Java 진영에서는 Spring Boot + Kafka 또는 @Async 기반 비동기 처리 방식이 많이 사용됩니다. 이 글에서는 이 두 가지 조합을 비교해보겠습니다.


    ✅ 개요

    항목 Django + Celery Spring Boot + Kafka
    언어/프레임워크 Python / Django Java / Spring Boot
    주요 목적 비동기 작업 처리, 주기적 작업 비동기 메시지 처리, 이벤트 기반 시스템
    메시지 브로커 Redis, RabbitMQ Kafka, RabbitMQ (또는 Redis)
    주기적 작업 지원 celery-beat로 cron 지원 @Scheduled, Quartz Scheduler 등
    실시간 비동기 작업 ✅ 가능 ✅ 가능
    확장성 수평 확장 쉬움 (Worker 방식) 고성능 스트리밍 처리 가능 (Kafka 기반)
    메시지 순서 보장 브로커 설정 및 Celery 설정 필요 Kafka 파티션 기준 순서 보장

    ✅ 구조적 차이점

    🔹 Django + Celery 구조

    사용자 요청
         ↓
      Django App
         ↓ (비동기 호출)
       Celery Task Queue
         ↓
       Redis / RabbitMQ (브로커)
         ↓
      Celery Worker → 결과 처리
    

    🔹 Spring Boot + Kafka 구조

    사용자 요청
         ↓
    Spring Boot App
         ↓ (KafkaTemplate 등으로 전송)
       Kafka Broker (토픽에 저장)
         ↓
    Kafka Consumer(@KafkaListener)
         ↓
        처리 및 응답 (필요시 DB 등)
    

    ✅ 개발자 경험 (DX) 비교

    항목 Django + Celery Spring Boot + Kafka
    설정 편의성 상대적으로 간단 (pip 설치) 설정이 복잡하고 JVM 생태계 요구
    디버깅 Celery 로그로 가능하나 초기엔 다소 헷갈림 Kafka는 구조 파악이 필요, 복잡도 높음
    문서/자료 많음 (Django/Celery 공식문서, 블로그) 많음 (Spring 공식 문서, Kafka 문서)
    실습 난이도 로컬에서도 쉽게 가능 Kafka는 도커/클러스터 등 환경 구성 필요

    ✅ 실무 적합성

    시나리오 추천 기술
    이메일/알림 발송, 예약작업 등 Django + Celery
    주문 이벤트 처리, 실시간 로그 수집 Spring Boot + Kafka
    고성능 스트리밍 처리 Kafka (Spring or Python)
    단순 백그라운드 작업 Celery or @Async (Spring)

    ✅ 결론

    • Python 개발자라면 Django + Celery로 빠르게 비동기/스케줄 작업 환경을 구축할 수 있습니다.

    • Java 기반 서비스나 마이크로서비스 환경이라면 Spring Boot + Kafka가 강력한 선택지입니다.

    • Kafka는 프레임워크가 아니라 메시지 시스템이므로, Django에서도 Kafka를 사용할 수 있습니다.

    결국 선택은 다음에 달려 있습니다:

    • 언어 선호도

    • 시스템 복잡도

    • 처리할 트래픽 규모

    • 운영 환경 구성 능력

    TOP
    preload preload